home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 4 / Amiga Tools 4.iso / tools / netzwerk / pronet / pronet20.lha / ProNET / source / drivers / serial.s < prev   
Text File  |  1995-06-22  |  5KB  |  270 lines

  1. **
  2. ** ProNET-Driver `serial'
  3. **
  4. ** 08-05-95    Started
  5. ** 05-06-95    init: flags argument
  6.  
  7. ; Format of one packet
  8. ; 2bytes    "R!" for packet recognization
  9. ; 2bytes    Length in Bytes of pure data without next two words
  10. ; 2bytes    Destination Port
  11. ; 2bytes    source Port
  12. ; xbytes    Data
  13.  
  14.         include    "A:OSmacros.i"
  15.         include    "exec/exec.i"
  16.         include    "devices/serial.i"
  17.         include    "a:ProNET/include/devices/pronet.i"
  18.         include    "exec_lib.i"
  19.  
  20. ; -- Initialization routine
  21. Init        ; a0 *DriverData
  22.         ; a1 *ConfigString after driver ID
  23.         ; d0 "RST!" for Identification
  24.         ; d1 Flags
  25.         ; RETURNS d0 <>0 if everything OK, else NULL!
  26.         movem.l    d2-d7/a2-a6,-(sp)
  27.         move.l    a0,a4
  28.         move.l    a1,a5
  29.         cmp.l    #"RST!",d0        ;compare ID
  30.         bne    .error
  31.         tst.l    d1
  32.         bne    .error            ;unknown Flags!
  33.  
  34.         bsr    StartDevice
  35.         tst.w    d0
  36.         beq.s    .error
  37.  
  38.         bsr    IssueReadCMD
  39.  
  40.         move.l    serialio(pc),a0
  41.         move.l    MN_REPLYPORT(a0),a0
  42.         move.b    MP_SIGBIT(a0),(a4)    ;Read Signalbit
  43.         move.l    #ReadQuery,2(a4)
  44.         move.l    #Read,6(a4)
  45.         move.l    #Write,10(a4)
  46.         moveq    #-1,d0
  47.         bra.s    .ende
  48.  
  49. .error        moveq    #0,d0
  50. .ende        movem.l    (sp)+,d2-d7/a2-a6
  51.         rts
  52.  
  53.         dc.b    "$VER: pronet-driver `serial' (05-06-95)",13,10,0
  54.         even
  55.  
  56. ; -- Start the right `serial.device'
  57. StartDevice    move.l    4.w,a6
  58.  
  59.         moveq    #IOEXTSER_SIZE,d0
  60.         bsr    GetIORequest
  61.         move.l    d0,serialio
  62.         beq    noiorequest
  63.  
  64.         moveq    #IOEXTSER_SIZE,d0
  65.         bsr    GetIORequest
  66.         move.l    d0,serialiow
  67.         beq    noiorequest2
  68.  
  69.         move.l    serialio(pc),a2
  70.         move.b    #SERF_7WIRE,IO_SERFLAGS(a2)
  71.  
  72.         move.l    a5,a0            ;device name
  73. .0        move.b    (a0)+,d0
  74.         cmp.b    #" ",d0
  75.         bhi.s    .0
  76.         clr.b    -1(a0)
  77.  
  78.         bsr    dec2long
  79.         move.l    d1,d5            ;unit
  80.         bsr    dec2long
  81.         move.l    d1,d6            ;baudrate
  82.  
  83.         move.l    a5,a0
  84.         move.l    d5,d0
  85.         move.l    a2,a1
  86.         moveq    #0,d1
  87.         LIBCALL    OpenDevice
  88.         tst.b    d0
  89.         bne.s    nodevice
  90.  
  91.         move.w    #SDCMD_SETPARAMS,IO_COMMAND(a2)
  92.         move.b    #SERF_XDISABLED^SERF_RAD_BOOGIE^SERF_7WIRE,IO_SERFLAGS(a2)
  93.         move.l    d6,IO_BAUD(a2)
  94.         move.l    #32768,IO_RBUFLEN(a2)
  95.         clr.l    IO_EXTFLAGS(a2)
  96.         move.b    #8,IO_READLEN(a2)
  97.         move.b    #8,IO_WRITELEN(a2)
  98.         move.b    #1,IO_STOPBITS(a2)
  99.         move.l    a2,a1
  100.         LIBCALL    DoIO
  101.         tst.b    d0
  102.         bne.s    noparams
  103.  
  104.         move.l    a2,a0
  105.         move.l    serialiow(pc),a1
  106.         move.l    a1,a2
  107.         move.l    MN_REPLYPORT(a2),d2
  108.         moveq    #IOEXTSER_SIZE,d0
  109.         LIBCALL    CopyMem
  110.         move.l    d2,MN_REPLYPORT(a2)
  111.  
  112.         moveq    #-1,d0
  113.         rts
  114.  
  115. noparams    move.l    a2,a1
  116.         LIBCALL    CloseDevice
  117. nodevice    move.l    serialiow(pc),a0
  118.         bsr    FreeIORequest
  119. noiorequest2    move.l    serialio(pc),a0
  120.         bsr    FreeIORequest
  121. noiorequest    moveq    #0,d0
  122.         rts
  123.  
  124. ; -- Put Out An 8 Bytes Read Command
  125. IssueReadCMD    move.l    4.w,a6
  126.         moveq    #0,d0
  127.         moveq    #0,d1
  128.         move.l    serialio(pc),a0
  129.         move.l    MN_REPLYPORT(a0),a0
  130.         move.b    MP_SIGBIT(a0),d2
  131.         bset    d2,d1
  132.         LIBCALL    SetSignal
  133.         move.l    serialio(pc),a2
  134.         move.w    #CMD_READ,IO_COMMAND(a2)
  135.         clr.b    IO_FLAGS(a2)
  136.         move.l    #buffer-2,IO_DATA(a2)
  137.         move.l    #8,IO_LENGTH(a2)
  138.         move.l    a2,a1
  139.         LIBJMP    SendIO
  140.  
  141. ; -- Read Query routine
  142. ReadQuery    ; RETURNS d0 length of pure data to come or NULL
  143.         ;         d1 destport
  144.         ;         d2 sourceport
  145.         movem.l    d3-d7/a2-a6,-(sp)
  146.         move.l    serialio(pc),a0
  147.         move.l    MN_REPLYPORT(a0),a0
  148.         move.l    4.w,a6
  149.         LIBCALL    GetMsg
  150.         tst.l    d0
  151.         beq.s    .nope
  152.         move.w    buffer-2(pc),d0
  153.         cmp.w    #"R!",d0
  154.         beq.s    .ok0
  155.  
  156.         bsr    ReadEmpty
  157.         bsr    IssueReadCMD
  158. .nope        clr.w    buffer
  159.  
  160. .ok0        movem.w    buffer(pc),d0-d2
  161.         movem.l    (sp)+,d3-d7/a2-a6
  162.         rts
  163.  
  164. ; -- Read routine
  165. Read        ; a0 *destination
  166.         movem.l    d2-d7/a2-a6,-(sp)
  167.         move.l    4.w,a6
  168.         move.l    serialio(pc),a1
  169.         move.l    a0,IO_DATA(a1)
  170.         moveq    #0,d0
  171.         move.w    buffer(pc),d0
  172.         move.l    d0,IO_LENGTH(a1)
  173.         move.w    #CMD_READ,IO_COMMAND(a1)
  174.         LIBCALL    DoIO
  175.         bsr    IssueReadCMD
  176.         movem.l    (sp)+,d2-d7/a2-a6
  177.         rts
  178.  
  179. ; -- Write routine
  180. Write        ; a0 *data1
  181.         ; d0.l datalength1 (even)
  182.         ; a1 *data2
  183.         ; d1.l datalength2 (even)
  184.         ; d2 Destination Port
  185.         ; d3 Source Port
  186.         ; d0+d1 <= $4000
  187.         ; d1=0 --> only first chunk is sent, else second is appended
  188.         ;          to first one and sent as one chunk!
  189.         ; RETURNS d0 <>0 on error, else NULL
  190.         movem.l    d2-d7/a2-a6,-(sp)
  191.         move.l    serialiow(pc),a2
  192.         move.l    4.w,a6
  193.         lea    buffer(pc),a5
  194.         movem.l    d0/d1/a0/a1,6(a5)
  195.  
  196.         move.w    d0,d4
  197.         add.w    d1,d4
  198.         move.w    d4,(a5)
  199.         move.w    d2,2(a5)
  200.         move.w    d3,4(a5)
  201.         lea    -2(a5),a0
  202.         move.w    #"R!",(a0)
  203.         move.l    a0,IO_DATA(a2)
  204.         move.l    #8,IO_LENGTH(a2)
  205.         move.w    #CMD_WRITE,IO_COMMAND(a2)
  206.         move.l    a2,a1
  207.         LIBCALL    DoIO
  208.  
  209.         move.w    #CMD_WRITE,IO_COMMAND(a2)
  210.         move.l    14(a5),IO_DATA(a2)
  211.         move.l    6(a5),IO_LENGTH(a2)
  212.         move.l    a2,a1
  213.         LIBCALL    DoIO
  214.  
  215.         move.w    #CMD_WRITE,IO_COMMAND(a2)
  216.         move.l    18(a5),IO_DATA(a2)
  217.         move.l    10(a5),IO_LENGTH(a2)
  218.         beq.s    .0
  219.         move.l    a2,a1
  220.         LIBCALL    DoIO
  221.  
  222. .0        moveq    #0,d0
  223.         movem.l    (sp)+,d2-d7/a2-a6
  224.         rts
  225.  
  226.         dc.w    0
  227. buffer        ds.b    64
  228.  
  229. ; -- A received message did not contain the "R!" string (probably
  230. ; -- the BaudBandit.device startup message), so clear it!
  231. ReadEmpty    move.l    serialio(pc),a2            * CMD_CLEAR
  232.         move.l    4.w,a6                * does not help!
  233. .loop        move.w    #SDCMD_QUERY,IO_COMMAND(a2)    * so we have to read
  234.         move.l    a2,a1                * it out!
  235.         LIBCALL    DoIO
  236.         move.l    IO_ACTUAL(a2),d0
  237.         beq.s    .ende
  238.         cmp.l    #64,d0
  239.         bcs.s    .ok0
  240.         moveq    #64,d0
  241. .ok0        move.l    d0,IO_LENGTH(a2)
  242.         move.l    #buffer,IO_DATA(a2)
  243.         move.w    #CMD_READ,IO_COMMAND(a2)
  244.         move.l    a2,a1
  245.         LIBCALL    DoIO
  246.         bra.s    .loop
  247. .ende        rts
  248.  
  249.  
  250. dec2long    ; konvertiert Dezimalstring ab (a0) zu Longword in D1 !!
  251.         moveq    #0,d1
  252. .loop        moveq    #0,d0
  253.         move.b    (a0)+,d0
  254.         sub.b    #"0",d0
  255.         cmp.b    #9,d0
  256.         bhi.s    .oki
  257.         move.l    d1,d2
  258.         lsl.l    #3,d1
  259.         add.l    d2,d1
  260.         add.l    d2,d1
  261.         add.l    d0,d1
  262.         bra.s    .loop
  263. .oki        rts
  264.  
  265. serialio    dc.l    0
  266. serialiow    dc.l    0
  267.  
  268.  
  269.         include    "A:ProNET/source/devio.s"
  270.